import { GetOpenId, GetUserInfo, AutoGetUserInfo, GetSignUpPermission } from "../../utils/data/apis";
import { UserInfo } from "../../utils/data/request/interface";
import { UpdateUserInfo } from "../../utils/data/apis";
import msg from "../../utils/model/msg";
import { CheckIdNum, CheckPhone } from "../../utils/function/tools";
import { EncryptTransist } from "../../utils/data/encrypt_transist";
import { event } from "../../utils/interface";

const app = getApp();
const type: any = {
  '姓名': 'name',
  '电话': 'phone',
  '身份证': 'idNum'
} // 输入框类型
const id_flag_zh: {[key: string]: string} = {
  student: '学生',
  parent: '家长',
  teacher: '导师'
} // 用户中文身份

// pages/login/index.ts
Page({

  /**
   * 页面的初始数据
   */
  data: {
    openid: "",
    name: '', // 姓名
    phone: '', // 电话
    idNum: '', // 身份证
    id_flag: '', // 用户身份 student|parent|teacher => onLoad时加载
    id_flag_zh: '', // 用户身份中文
    hidePolicy: true, // 是否隐藏用户协议
  },
  /**
   * @function 返回上一页面
   */
  navBack: function() {
    wx.navigateBack();
  },
  /**
   * @function 子组件通信内容（输入改变）
   * @param e {detail: {type: string, value: string}}
   */
  bindInput: function (e: any) {
    this.setData({
      [type[e.detail.type]]: e.detail.value
    })
  },
  /**
   * @function 登录检查
   */
  submitCheck: function () {
    msg.Loading();
    const { name, idNum, phone } = this.data;
    const origin = [name, idNum, phone];
    let verify: boolean = true; // 检查结果
    // 判空检查
    origin.forEach((item: string) => {
      if (item.length == 0) { verify = false };
    })
    if (!verify) {
      msg.HideLoading();
      msg.Fail("请完整输入");
      return;
    }
    /** 
     * 合法性检查 
     */
    if (phone.length != 11) { verify = false; }
    if (idNum.length != 18) { verify = false; }
    if(!verify) {
      msg.HideLoading();
      msg.Fail("输入格式有误");
      return;
    }
    if(!CheckIdNum(idNum)) {
      verify = false;
      msg.HideLoading();
      msg.Fail("身份证有误");
      return;
    }
    if(!CheckPhone(phone)) {
      verify = false;
      msg.HideLoading();
      msg.Fail("手机号有误");
    }
    // 合法
    if(verify) {
      msg.HideLoading();
      this.login();
    }
  },
  /**
   * @function 登录
   */
  login: function () {
    msg.Loading();
    const that = this;
    const data: UserInfo = {
      name: that.data.name,
      phone: that.data.phone,
      idNum: that.data.idNum,
      id_flag: that.data.id_flag,
    }
    const encrypt = new EncryptTransist();
    const submit: {key: string, data: string} = encrypt.Encrypt(JSON.stringify(data));
    GetUserInfo(submit)
      .then((res: any) => {
        console.log("获取UserInfo", res);
        msg.HideLoading();
        if (res.data.data) {
          const userInfo = res.data.data;
          console.log(userInfo);
          if (userInfo[0] == "该用户未注册") {
            // 未注册
            msg.Fail("用户未注册");
          }
          else {
            // 已注册
            wx.login({
              success: (res) => {
                // console.log("获取openid，wx.login", res);
                GetOpenId({ code: res.code })
                  .then((res: any) => {
                    // console.log("获取OpenId，GetOpenId",res)
                    if (res.data.openid) {
                      const openid = res.data.openid;
                      userInfo.openid = openid;
                      // 保存用户登录状态
                      wx.setStorageSync('user', userInfo);
                      wx.setStorageSync('id_flag', that.options.id);
                      that.setData({
                        openid: openid,
                      })
                      app.globalData.openid = openid;
                      let modelName: string;
                      let modelData: object = {
                        openid: openid,
                      };
                      // 更新openid绑定
                      switch (data.id_flag) {
                        default:
                        case 'student':
                          modelName = "Userinfo";
                          break;
                        case 'teacher':
                          modelName = "Teacher";
                          break;
                        case 'parent':
                          modelName = "UserParent";
                          break;
                      }
                      UpdateUserInfo({
                        id: userInfo.id,
                        modelData: modelData,
                        modelName: modelName,
                      })
                        .then(res => {
                        }) // 更新数据库信息
                        .catch(err => {
                          console.error("UpdateUserInfo err",err);
                        })
                      msg.Success("登录成功");
                      setTimeout(() => {
                        wx.reLaunch({
                          url: '../individual/index'
                        })
                      }, 1000) // 跳转到个人中心
                    }
                  }) // GetOpenId
                  .catch(err => {
                    console.error(err);
                    msg.Fail("获取信息失败");
                  })
              }
            }) // wx.login
          }
        }
      }) // 获取用户信息
      .catch(err => {
        msg.HideLoading();
        console.error(err);
        msg.Fail("连接错误");
      })
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options: { id: 'student' | 'teacher' | 'parent' }) {
    if (options.id) {
      console.log(id_flag_zh[options.id]+'端登录');
      this.nonInductiveAuthentication();
      this.setData({
        id_flag: options.id,
        id_flag_zh: id_flag_zh[options.id],
      })
    }
  },
  /**
   * @function 去注册
   */
  toSignUp: function() {
    // 获取注册开放许可
    GetSignUpPermission()
    .then((res: any) => {
      if(res.data.data.code !== 1) {
        msg.Fail('入口正在维护');
        return;
      }
      this.setData({
        hidePolicy: false, // 弹出授权窗口
      })
    })
    .catch(() => {
      msg.Fail('请求失败');
    })
  },
  /**
   * @function 收起服务协议弹窗
   */
  hidePolicy: function(e: event) {
    this.setData({
      hidePolicy: true
    })
    if(e.currentTarget.dataset.type == 'confirm') {
      // 跳转到注册界面
      wx.navigateTo({
        url: `../sign_up/index?id=${this.options.id}`,
      })
    }
  },
  /**
   * @function 无感认证
   */
  nonInductiveAuthentication: function() {
    msg.Loading();
    wx.login({
      success: res => {
        GetOpenId({
          code: res.code,
        }) // 获取openid
        .then((res: any) => {
          const openid = res.data.openid;
          const id_flag: any = this.options.id;
          // 无感获取用户信息
          AutoGetUserInfo({
            openid: openid, // openid
            id_flag: id_flag // 用户身份
          })
          .then((res: any) => {
            msg.HideLoading();
            console.log(res.data)
            if(res.data.data[0] == '该用户未注册') {
              return;
            }
            // 已注册 => 无感认证
            // 保存登录状态
            wx.setStorageSync('user', res.data.data);
            wx.setStorageSync('id_flag', id_flag);
            msg.Success('无感认证成功');
            setTimeout(() => {
              wx.reLaunch({
                url: '../individual/index',
              }) // 跳转个人中心
            }, 500)
          }) // 无感获取用户信息
          .catch(() => {
            msg.HideLoading();
          })
        }) // 获取OPENID
        .catch(() => {
          msg.HideLoading();
        })
      },
      // wx.login失败回调
      fail: () => {
        msg.HideLoading();
      }
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})